package com.atguigu.gulimall.product;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/*
* 1、整合MyBatis-Plus
*       1)导入依赖
*           <!--    mybatis plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>

        * 2)配置
        *   1.配置数据源：
        *       1）导入数据库驱动
        *       2）在application.yml中配置数据源相关信息
        *   2.配置MyBatis-Plus:
        *       1)使用@MapperScan
        *       2)告诉MyBatis-Plus,
*
*2.逻辑删除
* 2.1配置全局的逻辑删除规则（省略）
* 2.2配置逻辑删除的组件Bean(省略)
* 2.3加上逻辑删除注解给想要逻辑删除的字段，@TableLogic
*
* 3.JSR303
* 1)给Bean在字段上添加校验注解：javax.validation.constraints;并定义自己的message提示如： @NotBlank(message=" "品牌名必须提交")
* 1)给Bean在字段上添加校验注解：javax.validation.constraints;
* 2)在spring調用controller時标记为 Valid 表示开启验证
* 3)在校验的bean后紧跟一个BindingResult 即可记录校验的结果
* 4）分组校验
*       1.）@URL(message = "logo必须是一个合法的url地址",groups = {AddGroup.class,UpdateGroup.class})
*       2.）@Validated({AddGroup.class})
*       3.)默认没有指定分组的校验注解，在分组校验情况下不生效，当controller层不指定分组校验时生效
* 5)自定义校验
*       1）编写一个自定义的校验注解
*       2） 编写一个自定义的校验器ConstraintValidator
*       3) 关联自定义的校验器和自定义的校验注解
            *       @Documented
            @Constraint(
                    validatedBy = {ListValueConstraintValidator.class 可以在此指定多个不同的校验器适配不同类型的校验}
            )
            @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
            @Retention(RetentionPolicy.RUNTIME)

* 4.统一的异常处理
* @ControllerAdvice
*1)编写异常处理类，使用@ControllerAdvice
* 2)使用@ExceptionHandler标注方法可以处理的异常
* */
@EnableDiscoveryClient
@SpringBootApplication
public class GulimailProductApplication {
    public static void main(String[] args) {
        SpringApplication.run(GulimailProductApplication.class, args);
    }
}
